const sharp = require('sharp');
const fs = require('fs');
const readline = require('readline');
const path = require('path');
const os = require('os');
//临时文件夹
// const tempDir = './temp';
const tempDir = path.join(os.tmpdir(), 'imagecompressionTemp');
if (!fs.existsSync(tempDir)) {
    fs.mkdirSync(tempDir, { recursive: true });
}


let log = (...message) => {
    const logFilePath = path.join(tempDir, 'app.log');

    try {
        if (!fs.existsSync(logFilePath)) {
            // 如果日志文件不存在，创建一个空文件
            fs.writeFileSync(logFilePath, '', 'utf8');
        }

        fs.appendFileSync(logFilePath, message.join(' ') + '\n', 'utf8');
    } catch (err) {
        console.error('写入日志文件时出现错误:', err);
    }
    console.log(...message);
};


// 获取传递进来的参数
const args = process.argv.slice(2);
log('args', args);
// 获取args 图片路径 包括文件夹下面的图片
let imgPath = [];
//图片后缀
let imgSuffix = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'svg', 'avif'];

let getImgUrl = (item) => {
    //判断是否是文件夹
    const suffix = item.split('.').pop();
    if (imgSuffix.includes(suffix)) {
        imgPath.push(item);
    } else {
        //判断是否是文件夹路径
        try {
            if (!fs.existsSync(item)) {
                log('请传入文件夹路径或者图片路径');
                return;
            }
        } catch (e) {
            log(e, '请传入文件夹路径或者图片路径');
            return;
        }

        //获取文件夹下面的图片
        const files = fs.readdirSync(item);
        files.forEach((file) => {
            getImgUrl(item + '/' +file)

            // const suffix = file.split('.').pop();
            // if (imgSuffix.includes(suffix)) {
            //     imgPath.push(item + '/' + file);
            // }
        })
    }
};


args.forEach((item) => {
    getImgUrl(path.normalize(item))
});

log(imgPath);


log('开始压缩...', tempDir);

//读取图片 进行压缩
let prop = [];
let counter = 0; // 计数器用于确保临时文件名的唯一性

for (const item of imgPath) {
    // const tempOutputPath = path.join(tempDir, path.basename(item));

    const fileName = path.basename(item);
    const tempOutputPath = path.join(tempDir, `${counter++}_${fileName}`); // 使用计数器确保唯一性
    // console.log(tempOutputPath)

    // log(item,tempOutputPath);
    prop.push(
        sharp(item).png({
            quality: 80, // 调整质量（0-100），PNG 实际上是无损的，所以这个参数影响不大
            compressionLevel: 9 // 调整压缩级别（0-9），数字越大压缩越多
        }).toFile(tempOutputPath).then(() => {
            // 覆盖原始文件
            return new Promise((resolve, reject) => {
                fs.copyFile(tempOutputPath, item, (err) => {
                    if (err) return reject(err);
                    fs.unlink(tempOutputPath, (unlinkErr) => {
                        if (unlinkErr) return reject(unlinkErr);
                        resolve();
                    });
                });
            });
        }).catch((err) => {
            log('处理图像时出错：', item, err);
        })
    )
}

Promise.all(prop).then(() => {
    log('压缩完成');

    // 等待用户输入
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    rl.question('按回车键退出...', () => {
        rl.close();
    });

}).catch((err) => {
    log(err);
});
